package com.ljk.studywebsocket.config3;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.*;
import org.springframework.web.socket.handler.WebSocketHandlerDecoratorFactory;

import javax.annotation.Resource;

/**
 * <p>
 * 使用socketJs实现websocket
 * </p>
 */
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Resource
    private WebSocketHandlerDecoratorFactory handlerFactory;

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        //客户端连接端点
        registry.addEndpoint("/websocket")
                .setAllowedOrigins("*")
                .withSockJS();
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        // 启用简单的消息代理并配置一个或多个前缀以过滤以代理为目标的目标（例如，前缀为“/topic”的目标）。
        // 广播式配置一个 /topic 消息代理。
        registry.enableSimpleBroker("/topic/", "/queue/");

        //配置用于标识用户目标的前缀。用户目标使用户能够订阅其会话唯一的队列名称，以及其他人将消息发送到这些唯一的、特定于用户的队列。
        //例如，当用户尝试订阅“/user/queue/position-updates”时，目标可能会被转换为“/queue/position-updatesi9oqdfzo”，从而产生一个唯一的队列名称，不会与任何其他尝试这样做的用户发生冲突。随后，当消息发送到“/user/{username}/queue/position-updates”时，目的地被转换为“/queue/position-updatesi9oqdfzo”。
        //用于标识此类目标的默认前缀为“/user/”。
        registry.setUserDestinationPrefix("/queue/");
        // 为绑定了 @MessageMapping 注释方法的消息指定“/app”前缀。
        // 配置一个或多个前缀以过滤以应用程序注释方法为目标的目标。
        // 例如，前缀为“/app”的目的地可以通过注释方法处理，而其他目的地可以以消息代理为目标（例如“/topic”，“/queue”）。
        // 处理消息时，将从目标中删除匹配前缀以形成查找路径。 这意味着注释不应包含目标前缀。
        // 没有尾部斜杠的前缀将自动附加一个。
        registry.setApplicationDestinationPrefixes("/app");
    }

    /** 注册一个事件响应工厂 */
    @Override
    public void configureWebSocketTransport(WebSocketTransportRegistration registry) {
        registry.addDecoratorFactory(handlerFactory);
    }
}